package com.woniuxy.springmvcparam.controller;

import org.apache.commons.io.FileUtils;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;

/**
 * @author linke
 * @version 1.0
 * @className: FileController
 * @description: 文件控制器
 * @date 2021/11/14 13:05
 */
@Controller
@RequestMapping("file")
public class FileController {
    /**
     * 文件下载
     * @param fileName  文件名称
     * @param userAgent 浏览器的种类
     * @return  设置响应的实体对象 由于现在返回的是图片，所以以字节数组的方式返回
     */
    @RequestMapping(value = "/download")
    public ResponseEntity<byte[]> download(String fileName,@RequestHeader("User-Agent")String userAgent){
        String filePath = "D://files" + File.separator + fileName;
        File file = new File(filePath);

        try{
            if(file.exists()){
                //构建一个状态响应码 200
                ResponseEntity.BodyBuilder builder = ResponseEntity.ok();
                //设置文件的长度
                builder.contentLength(file.length());
                //告诉前端，后端现在给你的数据类型是：二进制流    如果返回的是json可以更改
                builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
                //文件名进行编码
                fileName = URLEncoder.encode(fileName, "UTF-8");
                //判断浏览器是否是IE浏览器
                if(userAgent.indexOf("MSIE") > 0){
                    builder.header("Content-Disposition","attachment;fileName="+fileName);
                }else{
                    builder.header("Content-Disposition","attachment;fileName*=UTF-8''"+fileName);
                }
                //通过FileUtils工具类，读取文件到响应体   核心处理步骤
                return builder.body(FileUtils.readFileToByteArray(file));
            }
        }catch (Exception e){e.printStackTrace();}



        return null;
    }


    /**
     * 文件上传测试
     * @param multipartFile 上传的文件 限定参数名
     * @param string    文件描述
     * @return
     */
    @RequestMapping(value="/upload")
    public String upload(@RequestParam("fileName")MultipartFile multipartFile, @RequestParam("description") String string){
        //输出文件名的名称和，文本域中的描述
        System.out.println(multipartFile);//org.springframework.web.multipart.commons.CommonsMultipartFile@2e7a8ac
        String originalFilename = multipartFile.getOriginalFilename();
        System.out.println(originalFilename);//路线图.jpg
        System.out.println(string);//222


        //如果没有文件服务器，就将文件持久化到本地磁盘中去
        String path = "D://files";
        File dir = new File(path);
        if(!dir.exists()){//路径不存在，则创建
            dir.mkdir();
        }
        //向文件夹中写入该文件
        String filePath = path + File.separator + originalFilename;
        try {
            multipartFile.transferTo(new File(filePath));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "jsp/success";
    }
}
